package com.iweb.servlet;

import com.google.gson.Gson;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.*;

@WebServlet("/upload/*")
// 设置当前servlet可以接收上传的文件
@MultipartConfig
public class UploadServlet extends HttpServlet {

    /**
     * 3.0之后
     * servlet会将上传的请求封装成 一个Part对象
     * 文件的类型、文件的大小、文件名称、文件内容(IO流)
     * 接收文件上传的上下文类型 multipart/form-data
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("upload...");

        // 获取文件封装的Part对象
        Collection<Part> parts = req.getParts();
        // 单个文件上传
        String fullFileName = "";
        if (parts.size() == 1) {
            Part part = req.getPart("file");
            String name = part.getName();
            String fileName = part.getSubmittedFileName();
            String type = part.getContentType();
            InputStream stream = part.getInputStream();
            System.out.println("key:" + name);
            System.out.println("文件名称:" + fileName);
            System.out.println("文件类型:" + type);

            // 生成文件名称 : 在外面的业务钟 这里可以区查询（session）当前用户的id，要加后缀
            fullFileName = UUID.randomUUID().toString().replace("-", "") + "-" + fileName;

            // 写出文件
            part.write("D:\\tools\\nginx-1.8.1\\nginx-1.8.1\\static\\avatar\\" + fullFileName);
        }

        // 多个文件上传： 不用
        // 为什么不用： 如果上传了20个文件,对于当前请求 servlet的请求是开启一个线程处理
        // 一般情况下多个文件上传前端可以通过 异步 请求
        if (parts.size() > 1) {
            Iterator<Part> its = parts.iterator();
            // 遍历得到每个Part对象
        }

        PrintWriter writer = resp.getWriter();
        Map<String, String> map = new HashMap<>();
        map.put("message", "ok");
        // 生成图片访问路径并返回
        map.put("src", "http://localhost:8081/avatar/" + fullFileName);
        writer.println(new Gson().toJson(map));
        writer.flush();
        writer.close();

    }
}
